package com.truyentranh.utils;
//package com.haibl.utils;
//
//import java.io.BufferedInputStream;
//import java.io.BufferedOutputStream;
//import java.io.ByteArrayOutputStream;
//import java.io.File;
//import java.io.FileDescriptor;
//import java.io.FileInputStream;
//import java.io.FileNotFoundException;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.OutputStream;
//import java.net.HttpURLConnection;
//import java.net.URL;
//import java.net.URLConnection;
//import java.util.ArrayList;
//import java.util.Enumeration;
//import java.util.Hashtable;
//
//import android.app.Activity;
//import android.graphics.Bitmap;
//import android.graphics.BitmapFactory;
//import android.os.Build;
//import android.os.Environment;
//import android.util.Log;
//
//import com.example.android.bitmapfun.util.ImageFetcher;
//
//public class ImageManager implements Runnable {
//
//	public static final String TAG = "Request";
//	public static int CONNECTION_TIMEOUT = 10000;
//	public static int SOCKET_TIMEOUT = 10000;
//	public static int NOTIFICATION_SOCKET_TIMEOUT = 10000;
//	public static int SOCKET_BUFFER_SIZE = 8192;
//	private static ImageManager instance = null;
//	private final int MAX_CACHED = 30;
//
//	private static String PATH_CACHED;
//	private static final String FOLDER_CACHED_IMAGE = "/HaiBL/";
//	public static String IMAGE_CACHED_FOLDER = null;
//
//	public static final int MEMCACHED = -110;
//	public static final int FILE = -111;
//	public static final int HTTP = -112;
//
//	public static Activity currentActivity = null;
//	private static boolean isInit = false;
//
//	public Hashtable<String, ObjectMemCached> memCached = new Hashtable<String, ObjectMemCached>();
//	public final Object lock = new Object();
//	private Thread getImageThreading = null;
//	private ArrayList<UrlRequest> mData = new ArrayList<UrlRequest>();
//
//	private final Hashtable<String, String> containUrlTable = new Hashtable<String, String>();
//	final Object imageLock = new Object();
//	final int MAX_SIZE = 10;
//
//	public static void INIT_CACHED(Activity currentActivity) {
//		if (!isInit) {
//			PATH_CACHED = Environment.getExternalStorageDirectory().toString();
//			IMAGE_CACHED_FOLDER = PATH_CACHED + FOLDER_CACHED_IMAGE;
//			File fileConnection = new File(IMAGE_CACHED_FOLDER);
//			//Logger.logMe("IMAGE_CACHED_FOLDER = " + IMAGE_CACHED_FOLDER);
//			if (!fileConnection.exists()) {
//				try {
//					boolean isCreated = fileConnection.mkdir();
//					//Logger.logMe("===================================================");
//					//Logger.logMe("Warning : Create or access cached isCreated = " + isCreated);
//					//Logger.logMe("===================================================");
//				} catch (Exception e) {
//					e.printStackTrace();
//				}
//
//			} else {
//				//Logger.logMe("===================================================");
//				//Logger.logMe("Warning : isCreated before ");
//				//Logger.logMe("===================================================");
//			}
//
//			ImageManager.isInit = true;
//		}
//		ImageManager.currentActivity = currentActivity;
//	}
//
//	public static void clearActivity() {
////		ImageManager.currentActivity = null;
//	}
//
//	public static ImageManager getInstance() {
//		if (instance == null)
//			instance = new ImageManager();
//		return instance;
//	}
//
//	private Bitmap processBitmap(String filePath) {
//
////		FileDescriptor fileDescriptor = null;
////		FileInputStream fileInputStream = null;
////
////		try {
////			File file = new File(filePath);
////			fileInputStream = new FileInputStream(file);
////			fileDescriptor = fileInputStream.getFD();
////		} catch (Exception e) {
////		} finally {
////			if (fileDescriptor == null && fileInputStream != null) {
////				try {
////					fileInputStream.close();
////				} catch (IOException e) {
////				}
////			}
////		}
//
//		Bitmap bitmap = null;
////		if (fileDescriptor != null) {
////			final int width = (int) Math.max(400, AppSettingParams.SCREEN_WIDTH * 2);
//			bitmap = BitmapFactory.decodeFile(filePath);
////			bitmap = ImageFetcher.decodeSampledBitmapFromDescriptor(fileDescriptor, width, (int) (AppSettingParams.SCREEN_HEIGHT * 2), null);
////		}
////		if (fileInputStream != null) {
////			try {
////				fileInputStream.close();
////			} catch (IOException e) {
////			}
////		}
//		return bitmap;
//	}
//
//	private Bitmap decodeBitMap(String filePath, String idFromUrl, boolean cached) {
//		if (filePath != null && !"".equals(filePath)) {
//			Bitmap bitmap = null;
//			try {
//				bitmap = processBitmap(filePath);
//
//				if (cached) {
//					if(bitmap.getWidth() <= 160){
//						putMemCached(idFromUrl, bitmap);
//					}					
//				}
//
//				return bitmap;
//			} catch (OutOfMemoryError me) {
//			} finally {
//				System.gc();
//			}
//		}
//		return null;
//	}
//
//	public boolean isContainUrl(String url) {
//		if (url != null) {
//			Object containUrl = containUrlTable.get(url);
//			return containUrl != null;
//		} else {
//			return true;
//		}
//	}
//
//	public Bitmap getImage(String url, IImageCached iImageCachedListener) {
//		final int size = mData.size();
//		if (!isContainUrl(url)) {
//			UrlRequest urlRequest = new UrlRequest(url, iImageCachedListener, false);
//			if (size >= MAX_SIZE) {
//				mData.remove(0);
//			}
//			mData.add(urlRequest);
//			if (getImageThreading == null) {
//				getImageThreading = new Thread(this);
//				getImageThreading.start();
//			}
//		}
//		return null;
//	}
//
//	public void clearMemCached() {
//		if (memCached != null) {
//			Enumeration<String> enumeration = memCached.keys();
//			
//			while (enumeration.hasMoreElements()) {
//				//Logger.logMe(">>>>>> clear bitmap");
//				String key = enumeration.nextElement().toString();
//				ObjectMemCached cached = memCached.remove(key);
//				cached.getBitmap().recycle();
//			}			
//			System.gc();
//		}
//	}
//
//	public void clearQueue() {
//		synchronized (this) {
//			if (mData != null) {
//				mData.clear();
//			}
//		}
//	}
//
//	public Bitmap getImage(String url, IImageCached iImageCachedListener, boolean isCached) {
//		if (isCached) {
//			Bitmap data = getMemCached(url);
//			if (data != null && !data.isRecycled()) {
//				//Logger.logMe("Hit cached....................>>>>>>>>>>>>>>>>>>>>>>>");
//				return data;
//			}
//		}
//		final int size = mData.size();
//		if (!isContainUrl(url)) {
//			UrlRequest urlRequest = new UrlRequest(url, iImageCachedListener, isCached);
//			if (size >= MAX_SIZE) {
//				mData.remove(0);
//			}
//			mData.add(urlRequest);
//			if (getImageThreading == null) {
//				getImageThreading = new Thread(this);
//				getImageThreading.start();
//			}
//		}
//		return null;
//	}
//
//	public void run() {
//		synchronized (this) {
//			while (true) {
//
//				if (!mData.isEmpty()) {
//					UrlRequest requester = null;
//					final int size = mData.size() - 1;
//					Object object = mData.get(size);
//					mData.remove(size);
//
//					if (object != null) {
//						requester = (UrlRequest) object;
//
//						String filePath = getImage(requester.getUrl(), requester.canCached());
//
//						IImageCached iImageCached = requester.getiImageCached();
//						if (isContainUrl(requester.getUrl())) {
//							containUrlTable.remove(requester.getUrl());
//						}
//						if (iImageCached != null) {
//							if (filePath != null) {
//								iImageCached.onImageReturn(null, decodeBitMap(filePath, StringUtils.MD5(requester.getUrl()), requester.canCached()));
//							} else {
//								iImageCached.onImageReturn(null, null);
//							}
//						}
//					}
//				} else {
//					getImageThreading = null;
//					break;
//				}
//			}
//		}
//	}
//
//	String getImage(String url, boolean cached) {
//		if (url != null && !url.equals("")) {
////			String id = StringUtils.MD5(url);
//
//			String fileName = getFileNameFromUrl(url);
//			String filePath = IMAGE_CACHED_FOLDER + fileName + ".img";
//
//			byte[] iDataByteArray = null;
//
//			Logger.logMe("try to get image " + filePath);
//			iDataByteArray = readFile(filePath);
//
//			if (iDataByteArray != null) {
//				Logger.logMe("image from file " + filePath);
//				return filePath;
//			} else {
//				Logger.logMe("image from http " + url);
//				iDataByteArray = httpDownload(url);
//				if (iDataByteArray != null) {
//					Logger.logMe("image from http done " + url);
//					// write to database
//					Logger.logMe("writeFile " + filePath);
//					writeFile(filePath, iDataByteArray);
//					return filePath;
//				}
//				return null;
//			}
//		}
//		return null;
//	}
//
//	public Bitmap getMemCached(String url) {
//		if (url != null && !url.equals("")) {
//			String id = StringUtils.MD5(url);
//			Object b = memCached.get(id);
//			if (b != null && b instanceof ObjectMemCached) {
//				//Logger.logMe("Hit memCached");
//				return ((ObjectMemCached) b).getBitmap();
//			}
//		}
//		return null;
//	}
//
//	void putMemCached(String id, Bitmap b) {
//		if (id != null && b != null) {
//			if (memCached.isEmpty()) {
//				memCached.put(id, new ObjectMemCached(System.currentTimeMillis(), b));
//			} else if (memCached.size() <= MAX_CACHED) {
//				memCached.put(id, new ObjectMemCached(System.currentTimeMillis(), b));
//			} else {
//				String iOlderKey = null;
//				long lst = -1;
//				Enumeration<String> enumeration = memCached.keys();
//				while (enumeration.hasMoreElements()) {
//					String mKey = enumeration.nextElement();
//
//					ObjectMemCached objectMemCached = memCached.get(mKey);
//					if (lst == -1) {
//						lst = objectMemCached.getLastAccess();
//						iOlderKey = mKey;
//					} else {
//						long accessTime = objectMemCached.getLastAccess();
//						if (accessTime < lst) {
//							lst = accessTime;
//							iOlderKey = mKey;
//						}
//					}
//				}
//				if (iOlderKey != null && !iOlderKey.equals("")) {
//					ObjectMemCached cached = memCached.remove(iOlderKey);
//					if (cached.getBitmap() != null) {
//						cached.getBitmap().recycle();
//						cached.data = null;
//					}
//					System.gc();
//				}
//				memCached.put(id, new ObjectMemCached(System.currentTimeMillis(), b));
//			}
//		}
//	}
//
//	private String getFileNameFromUrl(final String aUrl) {
//		return StringUtils.MD5(aUrl);
//	}
//
//	private byte[] readFile(String filePath) {
//		try {
//			if (filePath != null) {
//				File file = new File(filePath);
//				BufferedInputStream in = null;
//				FileInputStream fileInputStream = null;
//				try {
//					fileInputStream = new FileInputStream(file);
//					in = new BufferedInputStream(fileInputStream);
//
//					if (in != null) {
//						byte[] b = new byte[in.available()];
//						in.read(b);
//						return b;
//					}
//
//				} catch (FileNotFoundException e) {
//					e.printStackTrace();
//				} finally {
//					if (in != null) {
//						in.close();
//					}
//					in = null;
//					if (fileInputStream != null) {
//						fileInputStream.close();
//					}
//					fileInputStream = null;
//				}
//			}
//		} catch (OutOfMemoryError e) {
//		} catch (Exception e) {
//		}
//		return null;
//	}
//
//	private String writeFile(String fileName, byte[] b) {
//		File file = new File(fileName);
//		boolean created = true;
//		if (!file.exists()) {
//			try {
//				created = file.createNewFile();
//			} catch (IOException e) {
//				e.printStackTrace();
//				return null;
//			}
//		} else {
//			file.delete();
//			try {
//				created = file.createNewFile();
//			} catch (IOException e) {
//				e.printStackTrace();
//				return null;
//			}
//		}
//		if (created) {
//			FileOutputStream fileOutputStream = null;
//			try {
//				fileOutputStream = new FileOutputStream(file);
//				if (fileOutputStream != null) {
//					fileOutputStream.write(b);
//				}
//				return fileName;
//			} catch (FileNotFoundException e) {
//			} catch (IOException e) {
//				e.printStackTrace();
//			} finally {
//				try {
//					fileOutputStream.close();
//				} catch (IOException e) {
//					e.printStackTrace();
//				}
//				fileOutputStream = null;
//				System.gc();
//			}
//		}
//		return null;
//
//	}
//
//	byte[] httpDownload(String url) {
//		if (url != null && !url.equals("")) {
//			try {
//				return get(url);
//			} catch (Exception e) {
//
//			}
//		}
//		return null;
//	}
//
//	public byte[] readBytes(InputStream inputStream) throws IOException {
//		ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
//		int bufferSize = 1024;
//		byte[] buffer = new byte[bufferSize];
//		int len = 0;
//		while ((len = inputStream.read(buffer)) != -1) {
//			byteBuffer.write(buffer, 0, len);
//		}
//		return byteBuffer.toByteArray();
//	}
//
//	public static void disableConnectionReuseIfNecessary() {
//		// HTTP connection reuse which was buggy pre-froyo
//		if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) {
//			System.setProperty("http.keepAlive", "false");
//		}
//	}
//
//	private static final int IO_BUFFER_SIZE = 8 * 1024;
//
//	public boolean downloadUrlToStream(String urlString, OutputStream outputStream) {
//		disableConnectionReuseIfNecessary();
//		HttpURLConnection urlConnection = null;
//		BufferedOutputStream out = null;
//		BufferedInputStream in = null;
//
//		try {
//			final URL url = new URL(urlString);
//			urlConnection = (HttpURLConnection) url.openConnection();
//			in = new BufferedInputStream(urlConnection.getInputStream(), IO_BUFFER_SIZE);
//			out = new BufferedOutputStream(outputStream, IO_BUFFER_SIZE);
//
//			int b;
//			while ((b = in.read()) != -1) {
//				out.write(b);
//			}
//			return true;
//		} catch (final IOException e) {
//			Log.e(TAG, "Error in downloadBitmap - " + e);
//		} finally {
//			if (urlConnection != null) {
//				urlConnection.disconnect();
//			}
//			try {
//				if (out != null) {
//					out.close();
//				}
//				if (in != null) {
//					in.close();
//				}
//			} catch (final IOException e) {
//			}
//		}
//		return false;
//	}
//
//	private byte[] get(String mUrl) throws IOException {
//		URL url = null;
//		try {
//			url = new URL(mUrl);
//		} catch (Exception e) {
//			e.printStackTrace();
//			url = null;
//		}
//		if (url != null) {
//			URLConnection conexion = url.openConnection();
//			conexion.setConnectTimeout(CONNECTION_TIMEOUT);
//			conexion.connect();
//			// int lenghtOfFile = conexion.getContentLength();
//			InputStream input = new BufferedInputStream(url.openStream());
//			// byte data[] = new byte[1024];
//			// long total = 0;
//			// int count;
//			// while ((count = input.read(data)) != -1) {
//			// total += count;
//			// // publishProgress(""+(int)((total*100)/lenghtOfFile));
//			// output.write(data, 0, count);
//			// }
//
//			// output.flush();
//			// output.close();
//			// input.close();
//
//			try {
//				// input = url.openStream();
//				return readBytes(input);
//			} catch (Exception e) {
//
//			} finally {
//				if (input != null) {
//					try {
//						input.close();
//					} catch (IOException e) {
//						e.printStackTrace();
//					}
//				}
//			}
//		}
//		return null;
//
//	}
//
//	private class UrlRequest {
//
//		private String url;
//		private IImageCached iImageCached;
//		private boolean enableMemCached = false;
//
//		public UrlRequest(String url, IImageCached iImageCached, boolean cached) {
//			this.url = url;
//			this.iImageCached = iImageCached;
//			this.enableMemCached = cached;
//		}
//
//		public String getUrl() {
//			return url;
//		}
//
//		public IImageCached getiImageCached() {
//			return iImageCached;
//		}
//
//		public boolean canCached() {
//			return enableMemCached;
//		}
//
//	}
//
//	private class ObjectMemCached {
//		private long lastAccess = 0;
//		public Bitmap data;
//
//		public ObjectMemCached(long lassAccess, Bitmap iData) {
//			this.lastAccess = lassAccess;
//			this.data = iData;
//		}
//
//		public long getLastAccess() {
//			return lastAccess;
//		}
//
//		public Bitmap getBitmap() {
//			return this.data;
//		}
//	}
//
//}
